
/* ********************************************************************* */
/*                                                                       */
/*                       Librairies de Enseignant                          */
/*                                                                       */
/* ********************************************************************* */

#include "Enseignant.h"

/* ********************************************************************* */
/*                                                                       */
/*                        Les Fonctions                                  */
/*                                                                       */
/* ********************************************************************* */


void initEns(Ens *ens, const int numEns, const char *nomEns, const char *prenomEns)
{
 	assert(ens != NULL) ;

    setNumEns(ens,numEns);
    setNomEns(ens,nomEns);
    setPrenomEns(ens,prenomEns);
}

Ens * creEns(const int numEns,const char *nomEns, const char *prenomEns)
{
	Ens *ens= (Ens *) calloc(1,sizeof(Ens));
	initEns(ens, numEns, nomEns, prenomEns) ;

    return ens;
}

void libEns(Ens *ens)
{
   	ens->numEns     = 0 ;
   	ens->nomEns     = NULL;
	ens->prenomEns  = NULL;
}

void detEns(Ens ** ens)
{
    assert(*ens != NULL);

    libEns(*ens);
    free(*ens);
    *ens = NULL ;
}

/* ******************************************************************** */
/*																		*/
/*           Accesseurs et Mutateurs de la structure Enseignant           */
/*																		*/
/* ******************************************************************** */

int getNumEns(const Ens *ens)
{
    if(ens && (ens->numEns>0))
        return ens->numEns;
    else
        return 0;
}

void setNumEns(Ens *ens,const int numEns)
{
    assert(numEns>0);
    assert(ens!=NULL);
    ens->numEns=numEns;
}

char *getNomEns(const Ens *ens)
{
    if(ens && (ens->nomEns != NULL))
        return ens->nomEns;
    else
        return NULL;
}

void setNomEns(Ens * ens,const char * nomEns)
{
    assert(nomEns!=NULL);
    assert(ens!=NULL);
    ens->nomEns=(char *)nomEns;
}

char *getPrenomEns(const Ens *ens)
{
    if(ens && (ens->prenomEns != NULL))
        return ens->prenomEns;
    else
        return NULL;
}

void setPrenomEns(Ens * ens,const char * prenomEns)
{
    assert(prenomEns!=NULL);
    assert(ens!=NULL);
    ens->prenomEns=(char *)prenomEns;
}

void affEns(const Ens *ens)
{
	if(ens!=NULL && ens->nomEns!=NULL && ens->prenomEns!=NULL && ens->numEns>0)
	{
		printf("Numero Enseignant: %d\n",ens->numEns);
		printf("Nom Enseignant: %s\n" ,ens->nomEns);
		printf("Prenom Enseignant: %s\n",ens->prenomEns);
	}
	else
	{
		printf("\nAucun Enseignant!!");
	}
}

/* ********************************************************************* */
/*                                                                       */
/*             Fonctions relatives aux gestiond'Ens                       */
/*                                                                       */
/* ********************************************************************* */


void savEnsParElem(const int numEns,const char * nomEns, const char * prenomEns)
{
    FILE* f;
    f = fopen(ENS_DB, "a");/*creation du fichier s'il n'existe pas*/
    fclose(f);


    if(rchEnsParCode(numEns) == 0)
    {
        f = fopen(ENS_DB, "a");
        char*cnum=calloc(20,sizeof(char));
        sprintf(cnum,"%d",numEns);
        char*chaine=calloc(100,sizeof(char));

        strcat(chaine,cnum);
        strcat(chaine,":");
        strcat(chaine,nomEns);
        strcat(chaine,":");
        strcat(chaine,prenomEns);
        strcat(chaine,"\n");

        fputs(chaine, f);
        fclose(f);

        free(cnum);
        free(chaine);
    }

    else
    {
        printf("\Enseignant deja present dans la base de donnée!!!!!\n");
    }
}

void savEns(const   Ens*ens)
{
    savEnsParElem(ens->numEns,ens->nomEns,ens->prenomEns);
}

int rchEnsParCode(const int numEns)
{
    FILE* f;
    f=fopen(ENS_DB,"a");
    fclose(f);

    f = fopen(ENS_DB, "r");

    if (f==NULL)
    {
        printf("Erreur lors de l'ouverture de %s\n", ENS_DB);
        exit(EXIT_FAILURE);
    }

    char* contenu=calloc(100,sizeof(char));  /* déclaration d'une chaîne qui contiendra la ligne lue*/
    while(fgets(contenu,100,f)!=NULL)
    {
        char**tab=g_strsplit((gchar*)contenu,(gchar*)":",100);
        if(numEns == atoi(tab[0]))
        {
            free(tab);
            fclose(f);
            return 1;
        }
        free(tab);
    }
    free(contenu);

    if(!feof(f))
        printf("autre probleme \n");

    fclose(f);
    return 0;
}


Ens *recEnsParCode(const int numEns)
{
    FILE* f;
    f=fopen(ENS_DB,"a");
    fclose(f);

    f = fopen(ENS_DB, "r");

    if (f==NULL)
    {
        printf("Erreur lors de l'ouverture de %s\n", ENS_DB);
        exit(EXIT_FAILURE);
    }

    char* contenu=(char*)calloc(100, sizeof(char));  /* déclaration d'une chaîne qui contiendra la ligne lue*/
    while(fgets(contenu,100,f)!=NULL)
    {
         char**tabor=g_strsplit((gchar*)contenu,(gchar*)"\n",100);
         char**tab=g_strsplit((gchar*)tabor[0],(gchar*)":",100);

        if(numEns == atoi(tab[0]))
        {
            fclose(f);
            free(tabor);
            return creEns(atoi(tab[0]),tab[1],tab[2]);
        }
        /*free(tabor);
         free(tab);*/
    }
    free(contenu);
    if(!feof(f))
        printf("autre probleme \n");

    fclose(f);
    return NULL;
}

int supEns(Ens  *ens)
{
    assert(ens!=NULL);
    assert(ens->numEns>0);

    return  supEnsParCode(ens->numEns);
}

int supEnsParCode(const int numEns)
{
    char *contenu=calloc(100,sizeof(char));
    FILE * fIn;
    FILE * fOut;

    if ((fIn = fopen(ENS_DB, "r")) == NULL)
        return EXIT_FAILURE;

    if ((fOut = fopen("texte.tmp", "w")) == NULL)
    {
        fclose(fIn);
        return EXIT_FAILURE;
    }

    while (fgets(contenu,100, fIn))
    {
        char * ligne=calloc(100,sizeof(char));
        strcpy(ligne,contenu);
        char**tabor=g_strsplit((gchar*)contenu,(gchar*)"\n",100);
        char**tab=g_strsplit((gchar*)tabor[0],(gchar*)":",100);
        if (atoi(tab[0]) != numEns)
                    fputs(ligne, fOut);
        free(ligne);
        free(tabor);
        free(tab);
    }
    free(contenu);
    fclose(fIn);
    fclose(fOut);

    rename("texte.tmp", ENS_DB);
    return 0;
}

int modifEns(Ens*ens,Ens*ensnew)
{
    assert(ens!=NULL);
    assert(ensnew!=NULL);
    assert(ens->numEns>0);
    assert(ensnew->numEns>0);

    return  mdfEnsParCode(ens->numEns,ensnew);
}
/*
*
*
*
A       f   a   i   r   e
*
*
*/
int mdfEns(const Ens *ens, const Ens *ensnew)
{
    assert(ens!=NULL);
    assert(ensnew!=NULL);
    assert(ens->numEns>0    &&  ensnew->numEns>0);
    assert(ensnew->numEns==ens->numEns);

    return  mdfEnsParCode(ens->numEns,ensnew);
}

int mdfEnsParCode(const int numEns, const Ens *pEns)
{
    if(supEnsParCode(numEns)==0)
    {
       savEns(pEns);
       return   0;
    }
    return   -1;
}
/*
***
*   A       f   a   i   r   e
*
*
*/


void affEns_DB()
{
    FILE* f;

    f = fopen(ENS_DB, "r");

    if (f==NULL)
    {
        printf("Erreur lors de l'ouverture de %s\n", ENS_DB);
        exit(EXIT_FAILURE);
    }
    char*contenu=calloc(100,sizeof(char));
    while(fgets(contenu,100,f) != NULL)
    {
        char**tabor=g_strsplit((gchar*)contenu,(gchar*)"\n",100);
        char**tab=g_strsplit((gchar*)tabor[0],(gchar*)":",100);
        affEns(creEns(atoi(tab[0]),tab[1],tab[2]));
        free(tabor);
        free(tab);
    }
    free(contenu);

    if(!feof(f))
        printf("autre probleme \n");
    fclose(f);
}

/* ********************************************************************* */


void regEns()
{
    Ens ens1,ens2;
    Ens *ens3, *ens4;

    printf("\n\nTest de regression du module Enseignant :\n") ;

	printf("\nTest de initEnseignant pour un ensdiant de prenom prenomEns1 ");
        initEns(&ens1,111 ,"nomEns1","prenomEns1") ;
		affEns(&ens1);
        printf("ok.\n") ;

	printf("\nTest de initEnseignant pour un ensdiant de prenom prenomEns2 :");
        initEns(&ens2, 222,"nomEns2","prenomEns2") ;
		affEns(&ens2);
        printf("ok.\n") ;

	printf("\nTest de libereEnseignant pour un l'ensdiant ens1 de prenom prenomEns1 :  ");
        libEns(&ens1) ;
		printf("\nok.");
		printf("Affichage après liberation\n");
		affEns(&ens1);
        printf("ok.\n") ;

	printf("\nTest de libereEnseignant pour un l'ensdiant ens2 de prenom prenomEns2 :  ");
      	libEns(&ens2) ;
		printf("\nok.");
		printf("Affichage après liberation\n");
		affEns(&ens2);
        printf("ok.\n") ;


	printf("\nTest de creerEnseignant pour un ensdiant de prenom prenomEns3 :  ");
        ens3=creEns(333,"nomEns3","prenomEns3");
        affEns(ens3);
        printf("ok.\n");


    printf("\nTest de savEnsParElem pour trois Ens  :  ");
		savEnsParElem(444, "nom4", "prenom4");
		savEnsParElem(555, "nom5", "prenom5");
		savEnsParElem(666, "nom6", "prenom6");
		savEnsParElem(777, "nom7", "prenom7");
        printf("OK.\n") ;

    printf("\nTest de affEns_DB pour trois Ens  :  ");
        affEns_DB();
        printf("OK.\n") ;

    printf("\nTest de supEnsParCode pour un Ens de numEns 555:  ");
        supEnsParCode(555);
        affEns_DB();
        printf("OK.\n") ;

    printf("\nTest de mdfEnsParCode pour un Ens de code 444 a 333   :  ");
        mdfEnsParCode(444, ens3);
        mdfEnsParCode(555, ens3);

        affEns_DB();
        printf("OK.\n") ;

   printf("\nTest de recEnsParCode pour un Ens de code 666   :  ");
        ens4=recEnsParCode(666);
        affEns(ens4);
        detEns(&ens4);

	printf("\nTest de detruireEnseignant pour un l'ensdiant ensdiant  Ens3 ");

      	detEns(&ens3) ;
    	printf("OK.\n") ;
		printf("Affichage apres destruction\n");
        affEns(ens3);

        /*remove(DB_ENS);*/
	printf("\nTest de regression du module Enseignant terminé avec succés.\n\n") ;
}

